package com.lagou.wechat;

import com.github.wxpay.sdk.WXPayUtil;
import com.jfinal.kit.HttpKit;
import com.lagou.commons.PayConfig;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("order")
public class WechatPayController {

    @GetMapping("createCode")
    public Object createCode(String courseId, String courseName, String price) throws Exception {
        // 1.编写商户信息写入map
        Map<String, String> map = new HashMap<>();
        map.put("appid", PayConfig.appId); //公众账号ID
        map.put("mch_id", PayConfig.partner); //商户号
        map.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串
        courseName = new String(courseName.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
        map.put("body", courseName); //商品名称
        String orderId = WXPayUtil.generateNonceStr();
        System.out.println("订单编号 = " + orderId);
        map.put("out_trade_no", orderId); //商户订单号
        map.put("total_fee", price + ""); //订单金额,单位分
        map.put("spbill_create_ip", "127.0.0.1"); //终端IP
        map.put("notify_url", PayConfig.notifyUrl); //通知地址
        map.put("trade_type", "NATIVE"); //交易类型
        System.out.println("发送的map = " + map.toString());

        // 2.生成数字签名，并把商户信息转换成xml格式
        String xml = WXPayUtil.generateSignedXml(map, PayConfig.partnerKey);
        System.out.println("转换后的xml = " + xml);

        // 3.将商户信息发送给微信支付平台，生成订单
        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        String result = HttpKit.post(url, xml);
        System.out.println("返回的xml = " + result); //如果报错:<![CDATA[签名错误]]>商户四要素的原因，重置商户API密钥。

        // 4.微信支付平台返回xml格式数据，将其转换为map格式并返回给前端
        Map<String, String> resultMap = WXPayUtil.xmlToMap(result);
        resultMap.put("orderId", orderId);
        resultMap.put("money", price + "");

        // 5.将map返回给浏览器
        return resultMap;
    }

    @GetMapping("checkOrderStatus")
    public Object checkOrderStatus(String orderId) throws Exception {
        //1. 编写商户信息
        Map<String, String> map = new HashMap<>();
        map.put("appid", PayConfig.appId); //公众账号ID
        map.put("mch_id", PayConfig.partner); //商户号
        map.put("out_trade_no", orderId); //商户订单号
        map.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串

        //2. 生成数字签名
        String xml = WXPayUtil.generateSignedXml(map, PayConfig.partnerKey);

        //3. 发送查询请求给微信支付平台
        String url = "https://api.mch.weixin.qq.com/pay/orderquery";

        // 查询订单状态对开始时间点
        long beginTime = System.currentTimeMillis();

        while (true) {
            //4. 对微信支付平台返回对查询结果进行处理
            String result = HttpKit.post(url, xml);
            Map<String, String> resultMap = WXPayUtil.xmlToMap(result);

            // 已经支付成功，不再询问
            if (resultMap.get("trade_state").equalsIgnoreCase("SUCCESS")) {
                return resultMap;
            }

            // 超过30秒未支付，停止询问
            if (System.currentTimeMillis() - beginTime > 30000) {
                return resultMap;
            }

            // 每隔3秒查询一次微信后台
            Thread.sleep(3000);
        }
    }

}
